home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / nm5 / nm5.c next >
C/C++ Source or Header  |  1991-10-18  |  13KB  |  534 lines

  1. /*
  2.  画面に色々なエフェクトと同時に作画を行うプログラム
  3.     GCC TBIOSアクセス関数のチェック用。
  4.  
  5.   使用言語 GCC1.36 使用機種 FM-TOWNS 2M MEMORY.
  6.  
  7.  1 st // program written by s.k Mon.,Apr.30,'91
  8.  2 nd // arrenged by s.k Tus.,June 27,'91
  9.          変更内容 縦横ラフタースクロール設立
  10.  3 rd // arrenged by s.k Mon.,Aug 12,'91
  11.          変更内容 TOWNS-OS L30から画面を読み込むように
  12.  
  13.  冗談の塊ですからあてにしないように。
  14.  
  15. */
  16.  
  17.  
  18. #include <stdio.h>
  19. #include <tbios.h>
  20.  
  21. void main ()
  22. {
  23.     int i,j;
  24.  
  25.     setsumei ();                /* 説明表示 */
  26.     CRTC_init ();
  27.     EGB_displaypage (0,3);
  28.     EGB_vramstart (0,255);
  29.     EGB_gprint (0,0,"奇妙なグラフィックロード・デモ");
  30.     EGB_gprint (0,20,"               programed by s.k");
  31.     EGB_gprint (0,60,"L30 SYSTEM のCDをセットしてから");
  32.     EGB_gprint (0,80,"TOWNS-PADのAボタンを");
  33.     EGB_gprint (0,100,"               押してください。");
  34.     for (i=0;i<256;i++)
  35.     {
  36.         EGB_vramstart (0,255-i);
  37.     }
  38.     while ((SND_pad (0) & 0x10)!=0)
  39.     {
  40.             break_check ();
  41.     }
  42.     EGB_gprint (0,160,"それでは、開始します。");
  43. /* no.1 */
  44.     load_image ("q:/fj/photo/cat1.tif");
  45.     mosic ();
  46.     sprite_initilize ();
  47.     define_sprite_from_scrn ();
  48.     sprite_galaxy_hello ();
  49. /* no.2 */
  50.     load_image ("q:/fj/photo/cat2.tif");
  51.     define_sprite_from_scrn ();
  52.     sprite_galaxy_hello ();
  53. /* no.3 */
  54.     load_image ("q:/fj/photo/palm.tif");
  55.     define_sprite_from_scrn ();
  56.     sprite_galaxy_hello ();
  57. /* no.4 */
  58.     load_image ("q:/fj/photo/pool.tif");
  59.     define_sprite_from_scrn ();
  60.     for (i=0;i<=255;i++)        /* scroll right to left. */
  61.     {
  62.         SPR_display (2,0);
  63.         SPR_offset (255-i,0);
  64.         break_check ();
  65.     }
  66. /* no.5 */
  67.     load_image ("q:/fj/photo/penguin.tif");
  68.     define_sprite_from_scrn ();
  69.     sprite_galaxy_hello ();
  70. /* etc */
  71.     EGB_wait (180);
  72.     sprite_downto_bye ();
  73.  
  74.     sprite_upto_hello ();
  75.     EGB_wait (180);
  76.  
  77.     sprite_smallto_bye ();
  78.     sprite_bigto_hello ();
  79.     EGB_wait (180);
  80.     EGB_displaypage (1,2);        /* ぼろの出ないように */
  81.     sprite_rot ();                /* 傾く */
  82.     sprite_rot ();
  83.     sprite_rot ();
  84.     EGB_displaypage (1,3);        /* もどす */
  85.     EGB_wait (180);
  86.     sprite_mozic_bye ();
  87.     raf_2 ();
  88.     EGB_displaypage (0,0);
  89.     vram_erase ();
  90.     EGB_displaypage (0,3);
  91.     SPR_display (0,1024);
  92.     EGC_puts ("fin.\n");
  93. }
  94.  
  95. CRTC_init ()
  96. {
  97.     EGB_init ();
  98.     EGB_screen (1,6);
  99.     EGB_screen (0,6);
  100.     EGB_displaypage (1,2);
  101.     EGB_writepage (1);
  102.     EGB_zoom (2,2);
  103.     EGB_displaystart (32,0);
  104.     EGB_view (255,240);
  105.     EGB_backcolor (0x8000);
  106.     EGB_vramstart (0,0);
  107.     EGB_cls ();
  108.     EGB_writepage (0);
  109.     EGB_zoom (2,2);
  110.     EGB_view (255,240);
  111.     EGB_displaystart (32,0);
  112.     EGB_backcolor (0x8000);
  113.     EGB_cls ();
  114.     EGB_writecolor (0x7fff);
  115. }
  116.  
  117. load_image (char *fname)
  118. {
  119.     FILE *fopen (),*fp;
  120.     char scrn[320*240*2],buff[1024];
  121.     uint x,y,i;
  122.  
  123.     fp=fopen (fname,"rb");
  124.     if (fp==NULL)
  125.     {
  126.         EGB_writepage (0);
  127.         EGB_displaypage (0,3);
  128.         EGB_writecolor (0x7fff);
  129.         EGC_puts ("can not find file.\n");
  130.         exit (1);
  131.     }
  132.     fread (scrn,1,512,fp);
  133.     fread (scrn,1,320*240*2,fp);
  134.     fclose (fp);
  135.     EGB_displaypage (1,2);
  136.     for (y=0;y<200;y++)
  137.     {
  138.         for (x=0;x<255;x++)
  139.         {
  140.             buff[x*2]=scrn[640*3+32+x*2+y*320*2];
  141.             buff[x*2+1]=scrn[640*3+32+x*2+1+y*320*2];
  142.         }
  143.         EGB_put (0,y,255,y,buff);
  144.     }
  145. }
  146.  
  147. define_sprite_from_scrn ()
  148. {
  149.     char buff[1024];
  150.     char spr[16*16*2*208];
  151.     uint x,y,i;
  152.     uint pat=0,num=0;
  153.  
  154.     SPR_display (1,208);
  155.     EGB_displaypage (1,2);
  156.     for (y=0;y<13;y++)
  157.     {
  158.         for (x=0;x<16;x++)
  159.         {
  160.             EGB_get (x*16,y*16,x*16+15,y*16+15,buff);
  161.             for (i=0;i<(16*16*2);i++)
  162.                 spr[num++]=buff[i];
  163.         }
  164.     }
  165.     SPR_display (0,208);
  166.     for (i=0;i<255;i++)
  167.     {
  168.         EGB_writepage (1);
  169.         EGB_get (0,i,255,i,buff);
  170.         EGB_writepage (0);
  171.         EGB_put (0,i,255,i,buff);
  172.     }
  173.     EGB_displaypage (0,1);    
  174.     num=0;
  175.     for (y=0;y<13;y++)
  176.     {
  177.         for (x=0;x<16;x++)
  178.         {
  179.             SPR_set (1,128+4*(pat++),1,1,&spr[num]);
  180.             num+=512;
  181.         }
  182.     }
  183.     SPR_offset (256,256);
  184.     EGB_writepage (0);
  185.     EGB_writecolor (0);
  186.     EGB_line (0,0,255,0);
  187.     EGB_line (0,1,255,1);
  188.     EGB_displaypage (1,3);
  189.     SPR_display (1,208);
  190. }
  191.  
  192. sprite_initilize ()
  193. {
  194.     uint x,y;
  195.  
  196.     SPR_init ();
  197.     SPR_display (0,1);
  198.     for (x=0;x<16;x++)
  199.     {
  200.         for (y=0;y<13;y++)
  201.         {
  202.             SPR_attribute (1023-(x+y*16),1,1,128+(x+y*16)*4+0x8000,0);
  203.             SPR_setposition (0,1023-(x+y*16),1,1,x*16,y*16);
  204.         }
  205.     }
  206.     SPR_offset (256,256);
  207.     SPR_display (1,208);
  208. }
  209.  
  210. sprite_downto_bye ()
  211. {
  212.     uint x,y,i,j;
  213.     uint yd[208];
  214.  
  215.     for (i=0;i<208;i++)
  216.     {
  217.         yd[i]=240+rand () % 400;
  218.     }
  219.     for (j=0;j<256;j+=2)
  220.     {
  221.         break_check ();
  222.         SPR_display (2,0);
  223.         for (i=0;i<208;i++)
  224.         {
  225.             x=(i % 16)*16;
  226.             y=(i/16)*16+(yd[i]*j)/256;
  227.             if (y>300) y=300;
  228.             SPR_setposition (0,1023-i,1,1,x,y);
  229.         }
  230.     }
  231. }
  232.  
  233. sprite_upto_hello ()
  234. {
  235.     int x,y,i,j;
  236.     int yd[208];
  237.  
  238.     for (i=0;i<208;i++)
  239.     {
  240.         yd[i]=240+rand () % 400;
  241.     }
  242.     for (j=256;j>=0;j-=2)
  243.     {
  244.         break_check ();
  245.         SPR_display (2,0);
  246.         for (i=0;i<208;i++)
  247.         {
  248.             x=(i % 16)*16;
  249.             y=(i/16)*16+(yd[i]*j)/256;
  250.             if (y>300) y=300;
  251.             SPR_setposition (0,1023-i,1,1,x,y);
  252.         }
  253.     }
  254. }
  255.  
  256. sprite_mozic_bye ()
  257. {
  258.     int i,j,k,l;
  259.     int num[208];
  260.  
  261.     for (i=0;i<208;i++)
  262.     {
  263.         num[i]=i;
  264.     }
  265.     for (i=0;i<208;i++)
  266.     {
  267.         k=rand () % 208;
  268.         l=rand () % 208;
  269.         j=num[k];
  270.         num[k]=num[l];
  271.         num[l]=j;
  272.     }
  273.     for (i=0;i<208;i++)
  274.     {
  275.         SPR_display (2,0);
  276.         SPR_setposition (0,1023-num[i],1,1,480,480);
  277.     }
  278. }
  279.  
  280. sprite_galaxy_hello ()
  281. {
  282.     int i;
  283.  
  284.     for (i=255;i>=0;i=i-(256-i)/28-1)
  285.     {
  286.         SPR_display (2,0);
  287.         SPR_offset (-i,-i);
  288.         break_check ();
  289.     }
  290.     SPR_offset (0,0);
  291. }
  292.  
  293. sprite_bigto_hello ()
  294. {
  295.     int x,y,i,j;
  296.  
  297.     for (j=0;j<=64;j++)
  298.     {
  299.         break_check ();
  300.         SPR_display (2,0);
  301.         for (i=0;i<208;i++)
  302.         {
  303.             x=(((i % 16)*16)-128)*(j)/64+128;
  304.             y=(((i/16)*16)-100)*(j)/64+100;
  305.             SPR_setposition (0,1023-i,1,1,x,y);
  306.         }
  307.     }
  308. }
  309.  
  310. sprite_smallto_bye ()
  311. {
  312.     int x,y,i,j;
  313.  
  314.     for (j=64;j>=0;j--)
  315.     {
  316.         break_check ();
  317.         SPR_display (2,0);
  318.         for (i=0;i<208;i++)
  319.         {
  320.             x=(((i % 16)*16)-128)*(j)/64+128;
  321.             y=(((i/16)*16)-100)*(j)/64+100;
  322.             SPR_setposition (0,1023-i,1,1,x,y);
  323.         }
  324.     }
  325. }
  326.  
  327. sprite_rot ()        /* 傾く */
  328. {
  329.     int s,x,y,i,j;
  330.  
  331.     s=256;
  332.     for (j=0;j<=16;j++)                /* 右上がり */
  333.     {
  334.         break_check ();
  335.         SPR_display (2,0);
  336.         for (i=0;i<208;i++)
  337.         {
  338.             x=(i % 16)*16;
  339.             y=(i/16)*16+((104-(i % 16)*16)*j/s);
  340.             SPR_setposition (0,1023-i,1,1,x,y);
  341.         }
  342.     }
  343.     for (j=16;j>-16;j--)            /* 左下がり */
  344.     {
  345.         break_check ();
  346.         SPR_display (2,0);
  347.         for (i=0;i<208;i++)
  348.         {
  349.             x=(i % 16)*16;
  350.             y=(i/16)*16+((104-(i % 16)*16)*j/s);
  351.             SPR_setposition (0,1023-i,1,1,x,y);
  352.         }
  353.     }
  354.     for (j=-16;j<=0;j++)            /* 元に戻る */
  355.     {
  356.         break_check ();
  357.         SPR_display (2,0);
  358.         for (i=0;i<208;i++)
  359.         {
  360.             x=(i % 16)*16;
  361.             y=(i/16)*16+((104-(i % 16)*16)*j/s);
  362.             SPR_setposition (0,1023-i,1,1,x,y);
  363.         }
  364.     }
  365. }
  366.  
  367. setsumei ()
  368. {
  369.     VGA400_init ();
  370.  
  371.     EGB_displaypage (0,0);
  372.     EGB_gprint (0,0,"このプログラムは、単純に、次々と画面をロードした後に");
  373.     EGB_gprint (0,20,"表示するだけの物です。");
  374.     EGB_gprint (0,40,"これは、自分の作ったライブラリの動作を確認する為に");
  375.     EGB_gprint (0,60,"制作したもので、最後まで三十秒もないものです。");
  376.     EGB_gprint (0,80,"しかしながら、ちょっとした奇妙なアイディアを用いて");
  377.     EGB_gprint (0,100,"色々なエフェクト処理を行っています。");
  378.     EGB_gprint (0,120,"C言語+TBIOSでもこの位はできるということなので");
  379.     EGB_gprint (0,140,"す(VRAMやCRTCは直接触っていません)。");
  380.     EGB_gprint (0,160,"尚、最後はループ");
  381.     EGB_gprint (0,180,"しますので、パッドのAボタンを押してください。");
  382.     EGB_gprint (0,210,"本プログラムの最後では、かなり重たい処理をします。");
  383.     EGB_gprint (0,230,"ですから、低ウエイトモードの方が見やすいでしょう。");
  384.     EGB_gprint (0,250,"         (こんなんばっかり)");
  385.     EGB_displaypage (0,1);
  386.     EGB_gprint (0,300,"パッドのAボタンを押すことによって開始します。");
  387.     while ((SND_pad (0) & 0x10)!=0)
  388.     {
  389.             break_check ();
  390.     }
  391. }
  392.  
  393. /*
  394. ラフタースクロールルーチン
  395.  ここからは80386、TBIOSの限界に挑戦します。瀬古技を使っているにせよ
  396.  TBIOSのみでこのようなことが出来るのです!!
  397.   パソコン業界初 縦横同時ラフタースクロール!!(超誇大広告だ)
  398.  冗談ですよ、冗談。
  399. */
  400. raf_2 ()
  401. {
  402.     unsigned short int p[256*200*12];
  403.     unsigned short int q[256*200];
  404.     unsigned short int s[200];
  405.     int r[12]={0,1,3,5,6,7,7,6,5,3,1,0};
  406.     int i,j,y;
  407.  
  408.     SPR_display (0,1024);            /* スプライト機能停止 */
  409.     EGB_displaypage (0,1);
  410.     EGB_writepage (0);
  411.     EGB_get (0,0,255,199,&q[0]);    /* 元の画面 */
  412.     EGB_writepage (1);
  413.     EGB_backcolor (0xffff);
  414.     EGB_cls ();
  415.     EGB_displaypage (0,1);
  416.  
  417.     for (j=0;j<12;j++)
  418.     {
  419.         for (i=0;i<256;i++)
  420.         {
  421.             y=r[(i+j) % 12];
  422.             EGB_writepage (0);
  423.             EGB_get (i,0,i,199,&s[0]);
  424.             EGB_writepage (1);
  425.             EGB_put (i,y,i,y+199,&s[0]);
  426.         }
  427.         EGB_get (0,0,255,199,&p[256*200*j]);
  428.         EGB_cls ();
  429.     }
  430.     EGB_displaypage (1,2);
  431.     EGB_cls ();
  432.     EGB_writecolor (0x7fff);
  433.     EGB_gprint (20,100,"80386パワー全開!");
  434.     EGB_gprint (20,50,"TBIOSの限界に挑戦");
  435.     EGB_gprint (30,170,"終了はPAD-Aボタン");
  436.     waite (400);
  437.     i=0;
  438.     while ((SND_pad (0) & 0x10)!=0)
  439.     {
  440.         /* 縦ラフター */
  441.         for (i=0;((i<200)&&((SND_pad (0) & 0x10)!=0));i++)
  442.         {
  443.             EGC_vsync_wait ();
  444.             EGB_put (0,0,255,199,&p[256*200*(i % 12)]);
  445.             break_check ();
  446.         }
  447.         /* 縦ラフターに横振動を加える */
  448.         for (i=0;((i<200)&&((SND_pad (0) & 0x10)!=0));i++)
  449.         {
  450.             EGC_vsync_wait ();
  451.             for (j=0;j<200;j++)
  452.                 EGB_put (r[i%12],j,r[i%12]+255,j,&p[256*200*(i % 12)+j*256]);
  453.             break_check ();
  454.         }
  455.         /* 横ラフター */        
  456.         for (i=0;((i<200)&&((SND_pad (0) & 0x10)!=0));i++)
  457.         {
  458.             EGC_vsync_wait ();
  459.             for (j=0;j<200;j++)
  460.             {
  461.                 y=(i+j) % 12;
  462.                 EGB_put (r[y],j,r[y]+255,j,&q[j*256]);
  463.             }
  464.             break_check ();
  465.         }        
  466.         /* 縦横同時ラフター!! 80386 パワー全開!! */        
  467.         for (i=0;((i<200)&&((SND_pad (0) & 0x10)!=0));i++)
  468.         {
  469.             EGC_vsync_wait ();
  470.             for (j=0;j<200;j++)
  471.             {
  472.                 y=(i+j) % 12;
  473.                 EGB_put (r[y],j,r[y]+255,j,&p[256*200*(i % 12)+j*256]);
  474.             }
  475.             break_check ();
  476.         }        
  477.     }
  478. }
  479.  
  480. /*
  481.     ゆっくりとモザイクの掛かった絵が戻る。スーパー?ァミコンでよくやる
  482.     こと。
  483. */
  484. mosic ()        /* モザイク処理 */
  485. {
  486.     uint x,y;
  487.     uint v,i,s,ye=0,j;
  488.     uint s1=0,s2=1;
  489.     unsigned short int f[258*240];    /* VRAM バッファ */
  490.     unsigned short int g[258*240];
  491.  
  492.     EGB_displaypage (0,3);
  493.     EGB_writepage (0);
  494.     EGB_get (0,0,255,239,&g[0]);
  495.     EGB_cls ();
  496.     EGB_displaystart (32,0);
  497.     EGB_writepage (1);
  498.     EGB_cls ();
  499.     EGB_displaystart (32,0);
  500.         
  501.     for (v=16;v>=3;v--)
  502.     {
  503.         i=0;
  504.         for (y=0;y<(479/v);y++)
  505.         {
  506.             s=256*(240*y/(479/v));
  507.             for (x=0;x<(511/v);x++)
  508.                 f[i++]=g[s+256*x/(511/v)];
  509.         }
  510.         waite (v);
  511.         EGB_writepage (s1);
  512.         EGB_displaypage (s2,3);
  513.         x=s1; s1=s2; s2=x;
  514.         EGB_put (0,0,511/v-1,479/v-1,&f[0]);
  515.         EGB_zoom (v,v);
  516.         ye=ye+240/v;
  517.         break_check ();
  518.     }
  519.     waite (40);
  520.     EGB_displaypage (s2,3);
  521.     EGB_writepage (s2);
  522.     waite (40);
  523.     EGB_writepage (0);
  524.     EGB_put (0,0,255,239,&g[0]);    /* VRAM 0 は元の画面に戻る */
  525.     EGB_zoom (2,2);
  526.     EGB_writepage (1);
  527.     EGB_put (0,0,255,239,&g[0]);    /* VRAM 1 はVRAM 0と同じ */
  528.     EGB_zoom (2,2);
  529.     EGB_displaypage (0,3);
  530.     EGB_writepage (0);
  531.     EGB_cls ();
  532.     waite (170);
  533. }
  534.